import json
import os
# 使用相对导入来引用同包下的子包 models
from .models.clients import BaseLLMClient, ZhipuAIClient, DashScopeOpenAICompatibleClient

CONFIG_FILE = "config.json"

def load_config() -> dict:
    """加载 config.json 配置文件"""
    if not os.path.exists(CONFIG_FILE):
        raise FileNotFoundError(f"配置文件 {CONFIG_FILE} 未找到。")
    with open(CONFIG_FILE, 'r', encoding='utf-8') as f:
        return json.load(f)

def get_llm_client(task_name: str) -> BaseLLMClient:
    """
    根据任务名称从配置中获取并初始化相应的LLM客户端。

    参数:
        task_name (str): 任务名称，对应 config.json 中 task_model_mapping 的键。
                         例如："book_title", "plot_direction", "content_generation"

    返回:
        BaseLLMClient: 初始化后的LLM客户端实例。

    异常:
        ValueError: 如果配置无效或无法初始化客户端。
        FileNotFoundError: 如果配置文件未找到。
    """
    config = load_config()
    
    task_mapping = config.get("task_model_mapping", {})
    profile_key = task_mapping.get(task_name)
    if not profile_key:
        raise ValueError(f"任务 \"{task_name}\" 在 config.json 的 task_model_mapping 中没有找到对应的模型配置。")

    model_profiles = config.get("model_profiles", {})
    profile = model_profiles.get(profile_key)
    if not profile:
        raise ValueError(f"模型配置 \"{profile_key}\" 在 config.json 的 model_profiles 中没有找到。")

    provider = profile.get("provider")
    model_name = profile.get("model_name")
    api_key_env_var = profile.get("api_key_env_var")
    api_base_url = profile.get("api_base_url") # 可能为None

    # 优先从环境变量获取API Key，其次尝试从config中的default_api_key_values获取
    api_key = os.getenv(api_key_env_var)
    if not api_key:
        default_keys = config.get("default_api_key_values", {})
        api_key = default_keys.get(api_key_env_var)
        if api_key and ("YOUR_" in api_key or "_HERE" in api_key):
            print(f"警告: API Key '{api_key_env_var}' 从 config.json 加载了占位符值。请确保已设置环境变量或在config.json中更新为真实值。")
            api_key = None # 避免使用占位符
    
    if not api_key:
        raise ValueError(f"未能获取 API Key。请设置环境变量 \"{api_key_env_var}\" 或在 config.json 的 default_api_key_values 中提供。")

    if provider == "zhipuai":
        return ZhipuAIClient(api_key=api_key, model_name=model_name)
    elif provider == "aliyun_dashscope_openai_compatible":
        if not api_base_url:
            raise ValueError(f"模型配置 \"{profile_key}\" (aliyun_dashscope_openai_compatible) 缺少 api_base_url。")
        return DashScopeOpenAICompatibleClient(api_key=api_key, model_name=model_name, base_url=api_base_url)
    # elif provider == "doubao":
    #     # return DoubaoClient(api_key=api_key, model_name=model_name, base_url=api_base_url)
    #     raise NotImplementedError("豆包模型客户端尚未实现。")
    else:
        raise ValueError(f"不支持的提供商类型: {provider}")

if __name__ == '__main__':
    # 测试代码
    print("测试 LLM 管理器...")
    try:
        print("\n尝试获取 'book_title' 任务的客户端:")
        client_book = get_llm_client("book_title")
        print(f"成功获取到客户端: {client_book.__class__.__name__} 为模型 {client_book.model_name}")
        
        print("\n尝试获取 'plot_direction' 任务的客户端:")
        client_plot = get_llm_client("plot_direction")
        print(f"成功获取到客户端: {client_plot.__class__.__name__} 为模型 {client_plot.model_name}")
        
        print("\n尝试获取 'content_generation' 任务的客户端:")
        client_content = get_llm_client("content_generation")
        print(f"成功获取到客户端: {client_content.__class__.__name__} 为模型 {client_content.model_name}")

        # 假设我们在config.json中把 content_generation 的模型改为 aliyun_qwen_turbo 进行测试
        # config["task_model_mapping"]["content_generation"] = "aliyun_qwen_turbo"
        # with open(CONFIG_FILE, 'w') as f:
        #     json.dump(config, f, indent=2)
        # client_content_ali = get_llm_client("content_generation")
        # print(f"\n切换后，'content_generation' 客户端: {client_content_ali.__class__.__name__} 模型 {client_content_ali.model_name}")

    except Exception as e:
        print(f"测试过程中发生错误: {e}") 